# -*- coding: utf-8 -*-
"""
jsonpath库对比测试脚本
测试不同jsonpath库对特殊字符处理和正则表达式支持的能力
"""

# 示例数据
data = {
	"returncode": 0,
	"message": "成功",
	"result": {
		"specid": 66917,
		"paramtypeitems": [{
			"name": "基本参数",
			"paramitems": [{
				"id": 113,
				"name": "车型名称",
				"displaytype": 0,
				"value": "零跑C11 2024款 纯电 580激光雷达版",
				"sublist": []
			},
			{
				"id": 112,
				"name": "厂商指导价(元)",
				"displaytype": 0,
				"value": "17.88万",
				"sublist": []
			},
			{
				"id": 111,
				"name": "厂商",
				"displaytype": 0,
				"value": "零跑汽车",
				"sublist": []
			},
			{
				"id": 110,
				"name": "厂商指导价",
				"displaytype": 0,
				"value": "16.88万",
				"sublist": []
			},
		],
		"subparamitems": []
		}
		]
	}
}

print("="*60)
print("JSONPath库对比测试")
print("="*60)

# 1. 当前使用的 python-jsonpath 库
try:
    from jsonpath import jsonpath
    print("\n1. 当前使用的 python-jsonpath 库:")
    print("- 测试特殊字符 '厂商指导价(元)':", jsonpath(data, "$..[?(@.name=='厂商指导价(元)')].value"))
    print("- 测试正则表达式:          ", jsonpath(data, "$..[?(@.name=~'.*厂商指导价.*')].value"))
    print("- 测试精确匹配 '厂商指导价': ", jsonpath(data, "$..[?(@.name=='厂商指导价')].value"))
except ImportError:
    print("\n1. python-jsonpath 库未安装")

# 2. jsonpath-ng 库（推荐替代）
try:
    from jsonpath_ng import parse
    from jsonpath_ng.ext import parse as parse_ext  # 扩展版本支持正则表达式
    print("\n2. jsonpath-ng 库（推荐）:")
    
    # 使用扩展版本进行测试
    print("使用扩展版本 (jsonpath_ng.ext) 测试:")
    
    # 测试1: 精确匹配（不带特殊字符）
    expr_exact = parse_ext("$..paramitems[?(@.name=='厂商指导价')].value")
    result_exact = [match.value for match in expr_exact.find(data)]
    print("- 测试1: 精确匹配 '厂商指导价': ", result_exact)
    
    # 测试2: 正则表达式匹配（解决问题2）
    expr_regex = parse_ext("$..paramitems[?(@.name=~'.*厂商指导价.*')].value")
    result_regex = [match.value for match in expr_regex.find(data)]
    print("- 测试2: 正则表达式匹配:        ", result_regex)  # 成功匹配两个结果
    
    # 测试3: 解决特殊字符问题的正确方法（问题1）
    # 方法A: 通过精确路径和过滤器
    try:
        # 使用正确的语法处理特殊字符
        expr_special = parse_ext("$..paramitems[?(@.name=='厂商指导价(元)')].value")
        result_special = [match.value for match in expr_special.find(data)]
        print("- 测试3: 特殊字符匹配 '厂商指导价(元)':", result_special)
    except Exception as e:
        print("- 测试3: 直接特殊字符匹配出错:", str(e))
    
    # 方法B: 对于复杂特殊字符，使用两次查询的方法
    print("- 测试4: 两步查询法处理特殊字符:")
    # 第一步：获取所有paramitems
    all_paramitems_expr = parse("$..paramitems[*]")
    all_paramitems = [match.value for match in all_paramitems_expr.find(data)]
    # 第二步：在Python中过滤（仅当直接jsonpath查询失败时使用）
    special_matches = []
    for item in all_paramitems:
        if isinstance(item, dict) and item.get('name') == '厂商指导价(元)':
            special_matches.append(item.get('value'))
    print("  结果:", special_matches)
    
    print("\n✅ jsonpath-ng 优势:")
    print("- 完全支持正则表达式")
    print("- 语法更灵活")
    print("- 社区活跃，维护良好")
    
except ImportError:
    print("\n2. jsonpath-ng 库未安装 (推荐安装: pip install jsonpath-ng)")

# 3. jmespath 库（另一个选择）
try:
    import jmespath
    print("\n3. jmespath 库:")
    # jmespath使用不同的语法，但功能强大
    # 测试精确匹配
    result_jmespath_exact = jmespath.search("result.paramtypeitems[*].paramitems[*][?name=='厂商指导价'].value[]", data)
    print("- 测试精确匹配 '厂商指导价': ", result_jmespath_exact)
    
    # jmespath不直接支持正则，但可以通过函数实现类似功能
    # 这里展示基本用法
    print("- jmespath 使用不同语法，但支持复杂查询")
    print("✅ 功能强大的JSON查询库")
except ImportError:
    print("\n3. jmespath 库未安装 (pip install jmespath)")

# 4. jsonpath-rw 库
try:
    from jsonpath_rw import parse as parse_rw
    print("\n4. jsonpath-rw 库:")
    # 测试特殊字符
    expr_special_rw = parse_rw("$..[?(@.name=='厂商指导价(元)')].value")
    result_special_rw = [match.value for match in expr_special_rw.find(data)]
    print("- 测试特殊字符 '厂商指导价(元)':", result_special_rw)
    
    # 测试正则表达式
    expr_regex_rw = parse_rw("$..[?(@.name=~'.*厂商指导价.*')].value")
    result_regex_rw = [match.value for match in expr_regex_rw.find(data)]
    print("- 测试正则表达式:          ", result_regex_rw)
except ImportError:
    print("\n4. jsonpath-rw 库未安装 (pip install jsonpath-rw)")

print("\n" + "="*60)
print("实际问题解决方案 (基于测试结果):")
print("="*60)
print("# 问题1和问题2的完美解决方案 - 使用jsonpath-ng库")
print("""
# 安装: pip install jsonpath-ng
from jsonpath_ng.ext import parse

# 原问题1: 匹配带小括号的特殊字段
# 方法1: 直接匹配（取决于特殊字符复杂度）
expr1 = parse("$..paramitems[?(@.name=='厂商指导价(元)')].value")
result1 = [match.value for match in expr1.find(data)]  # 可能需要两步查询法

# 方法2: 两步查询法（更可靠）
all_items = parse("$..paramitems[*]")
items = [match.value for match in all_items.find(data)]
special_values = [item['value'] for item in items if item.get('name') == '厂商指导价(元)']

# 原问题2: 正则表达式匹配（完全解决）
expr2 = parse("$..paramitems[?(@.name=~'.*厂商指导价.*')].value")
regex_result = [match.value for match in expr2.find(data)]  # 成功获取所有相关值
""")
print("\n推荐结论:")
print("1. 最佳替代: jsonpath-ng - 解决了正则表达式支持问题")
print("2. 对于特殊字符: 可以通过两步查询法可靠解决")
print("3. 安装命令: pip install jsonpath-ng")
print("4. 优势: 功能全面，语法标准，社区活跃")
print("="*60)